home *** CD-ROM | disk | FTP | other *** search
Prolog Source | 1986-10-07 | 3.0 KB | 118 lines |
- /*
- This program creates the menu for many of the
- sample programs. You may use it.
-
- Call it with the following:
-
- menu(upper_left_x,upper_left_y,[choice_list],choice).
-
- Try the goal:
- menu(4,4,[hi,bye,hello,good_bye],Ans).
- */
-
- DOMAINS
- STRLIST=STRING*
- KEY = cr; esc; break; tab; btab; del; bdel; ins;
- end; home; ftast(INTEGER); up; down; left; right;
- tegn(CHAR); otherspec
-
- PREDICATES
- menu(INTEGER,INTEGER,STRLIST,INTEGER)
- readkey(KEY)
- readkey1(KEY,CHAR,INTEGER)
- readkey2(KEY,INTEGER)
-
- /* Menu selection */
- maxlen(STRLIST,INTEGER,INTEGER)
- listlen(STRLIST,INTEGER)
- writelist(INTEGER,INTEGER,STRLIST)
- menu1(INTEGER,INTEGER,INTEGER,INTEGER)
- menu2(INTEGER,INTEGER,INTEGER,INTEGER,KEY)
- adjustwindow(INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER)
-
-
- CLAUSES
-
- readkey(KEY):-readchar(T),char_int(T,VAL),readkey1(KEY,T,VAL).
-
- readkey1(KEY,_,0):-!,readchar(T),char_int(T,VAL),readkey2(KEY,VAL).
- readkey1(cr,_,13):-!.
- readkey1(esc,_,27):-!.
- readkey1(break,_,3):-!.
- readkey1(tab,_,0):-!.
- readkey1(bdel,_,8):-!.
- readkey1(tegn(T),T,_) .
-
- readkey2(btab,15):-!.
- readkey2(del,83):-!.
- readkey2(ins,82):-!.
- readkey2(up,72):-!.
- readkey2(down,80):-!.
- readkey2(left,75):-!.
- readkey2(right,77):-!.
- readkey2(home,71):-!.
- readkey2(end,79):-!.
- readkey2(ftast(N),VAL):- VAL>58 and VAL<70 and N=VAL-58, !.
- readkey2(otherspec,_).
-
- menu(LI,KOL,LIST,CHOICE) :-
- maxlen(LIST,0,Strln),
- listlen(LIST,Lstlngh), Lstlngh>0,!,
- Strlngh = Strln + 2,
- HH1= Lstlngh+2, HH2=Strlngh + 2,
- adjustwindow(LI,KOL,HH1,HH2,ALI,AKOL),
- makewindow(3,7,7,"",ALI,AKOL,HH1,HH2),
- HH3=Strlngh,
- writelist(0,HH3,LIST),cursor(0,0),
- menu1(0,Lstlngh,Strlngh,CH),
- CHOICE=1+CH,
- removewindow.
-
- menu(_,_,_,255).
-
- maxlen([H|T],MAX,MAX1) :-
- str_len(H,LENGTH),
- LENGTH>MAX,!,
- maxlen(T,LENGTH,MAX1).
- maxlen([_|T],MAX,MAX1) :-maxlen(T,MAX,MAX1).
- maxlen([],LEN,LEN).
-
- listlen([],0).
- listlen([_|T],N):-
- listlen(T,X),
- N=X+1.
-
- writelist(_,_,[]).
- writelist(LI,Strlngh,[H|T]):-field_str(LI,0,Strlngh,H),
- LI1=LI+1,writelist(LI1,Strlngh,T).
-
- menu1(LI,MAXLI,Strlngh,CHOICE):-
- field_attr(LI,0,Strlngh,112),
- cursor(LI,0),
- readkey(KEY),
- menu2(LI,MAXLI,Strlngh,CHOICE,KEY).
-
- menu2(_,_,_,-1,esc):-!.
- menu2(LI,_,_,LI,ftast(10)):-!.
- menu2(LI,_,_,LI,cr):-!.
- menu2(LI,MAXLI,Strlngh,CHOICE,up):-
- LI>0,!,
- field_attr(LI,0,Strlngh,7),
- LI1=LI-1,
- menu1(LI1,MAXLI,Strlngh,CHOICE).
-
- menu2(LI,MAXLI,Strlngh,CHOICE,down):-
- LI<MAXLI-1,!,
- field_attr(LI,0,Strlngh,7),
- LI1=LI+1,
- menu1(LI1,MAXLI,Strlngh,CHOICE).
-
- menu2(LI,MAXLI,Strlngh,CHOICE,_):-
- menu1(LI,MAXLI,Strlngh,CHOICE).
-
- adjustwindow(LI,KOL,DLI,DKOL,LI,KOL):-LI<25-DLI, KOL<80-DKOL,!.
- adjustwindow(LI,_,DLI,DKOL,LI,AKOL):-LI<25-DLI, !, AKOL=80-DKOL.
- adjustwindow(_,KOL,DLI,DKOL,ALI,KOL):-KOL<80-DKOL, !, ALI=25-DLI.
- adjustwindow(_,_,DLI,DKOL,ALI,AKOL):-ALI=25-DLI, AKOL=80-DKOL.
-
-